<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>烟花效果C</title>
    <style>
        /* 设置页面样式 */
        body {
            margin: 0;
            /* 去掉默认的边距 */
            overflow: hidden;
            /* 隐藏超出屏幕的部分 */
            background-color: rgb(255, 255, 255);
            /* 设置背景颜色为黑色 */
        }

        canvas {
            display: block;
            /* 确保canvas元素以块级元素显示 */
        }

        .baidu {
            position: absolute;
            left: 10px;
            top: 10px;
            border: 1px solid white;
            color: red;
        }
    </style>
</head>

<body>
    <canvas id="fireworksCanvas"></canvas>
    <div class="baidu">
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
        <h2>www.baidu.com</h2>
    </div>
    <script>
        // 获取canvas元素并设置其上下文
        const canvas = document.getElementById('fireworksCanvas');
        const ctx = canvas.getContext('2d');
        canvas.width = 420*2;
        canvas.height = 420;
        bj_fill_alpha=0.3;// 越小值填充透明度越少偏白
        px_die_alpha=0.1; // 值越小过滤越慢消失
        px_num=10;//越小值越小点数
        px_update_alpha=0.001;// 越小值越慢消失
        px_space=1;// 越小值越慢
        // canvas.width = window.innerWidth; // 设置canvas宽度为屏幕宽度
        // canvas.height = window.innerHeight; // 设置canvas高度为屏幕高度

        // // 监听窗口大小变化，动态调整canvas大小
        // window.addEventListener('resize', () => {
        //     canvas.width = window.innerWidth;
        //     canvas.height = window.innerHeight;
        // });

        // 定义粒子类
        class Particle {
            // 类的构造默认函数
            constructor(x, y, color) {
                this.x = x; // 粒子的初始x坐标
                this.y = y; // 粒子的初始y坐标
                this.color = color; // 粒子的颜色
                this.radius = Math.random() * 2 + 1; // 粒子的半径，随机值在1到3之间
                this.velocityX = (Math.random() - 0.5) * px_space; // 粒子的水平速度，随机值在-4到4之间
                this.velocityY = (Math.random() - 0.5) * px_space; // 粒子的垂直速度，随机值在-4到4之间
                this.alpha = 1; // 粒子的初始透明度
            }

            // 类的绘制粒子方法
            draw() {
                ctx.save(); // 保存当前绘图状态
                ctx.globalAlpha = this.alpha; // 设置粒子的透明度
                ctx.beginPath(); // 开始绘制路径
                // 绘制圆形粒子
                // x: 粒子的水平位置 y: 粒子的垂直位置 radius: 粒子的半径
                // startAngle: 0，表示从正x轴开始
                // endAngle: Math.PI * 2，表示绘制一个完整的圆（360度）
                // anticlockwise: false（默认值），表示顺时针绘制
                ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); // 绘制圆形粒子
                ctx.fillStyle = this.color; // 设置粒子的填充颜色
                ctx.fill(); // 填充圆形
                ctx.restore(); // 恢复之前保存的绘图状态
            }

            // 更新粒子状态方法
            update() {
                this.x += this.velocityX; // 更新粒子的水平位置
                this.y += this.velocityY; // 更新粒子的垂直位置
                this.alpha -= px_update_alpha; // 逐渐减少粒子的透明度，模拟粒子消散的效果
            }
        }

        // 存储所有粒子的数组
        let particles = [];

        // 创建烟花效果
        function createFirework(x, y) {
            for (let i = 0; i < px_num; i++) { // 创建100个粒子
                particles.push(new Particle(x, y, `hsl(${Math.random() * 360}, 100%, 50%)`));
                // 随机生成粒子的颜色，使用HSL颜色模式，色调随机，饱和度和亮度固定
            }
        }

        // 监听鼠标点击事件，触发烟花效果
        canvas.addEventListener('click', (event) => {
            createFirework(event.clientX, event.clientY); // 在鼠标点击的位置创建烟花
        });

        // 动画循环
        function animate() {
            // 使用半透明的黑色覆盖整个canvas，模拟粒子的消散效果
            ctx.fillStyle = 'rgba(0, 0, 0, bj_fill_alpha)';
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            // 过滤掉透明度小于0的粒子
            particles = particles.filter(p => p.alpha > px_die_alpha);
            console.log(particles.length)
            // 遍历所有粒子，更新并绘制每个粒子
            particles.forEach(p => {
                p.update();
                p.draw();
            });

            // 使用requestAnimationFrame实现递归调用，形成动画效果
            requestAnimationFrame(animate);
        }

        // 启动动画
        animate();
    </script>
</body>

</html>